package com.sky.config;

import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
@Slf4j
/**
 * 当前配置类不是必须的，因为 Spring Boot 框架会自动装配 RedisTemplate 对象，但是默认的key序列化器为
 * JdkSerializationRedisSerializer，导致我们存到Redis中后的数据和原始数据有差别，故设置为StringRedisSerializer序列化器。
 */
public class RedisConfiguration {

    /**
     * 配置RedisTemplate对象
     * @param factory Redis连接工厂
     * @return RedisTemplate对象
     */
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
        log.info("开始创建redis模板对象...");
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //设置redis的连接工厂对象
        template.setConnectionFactory(factory);

        // String的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // json序列化配置
        GenericFastJsonRedisSerializer jackson2JsonRedisSerializer = new GenericFastJsonRedisSerializer();
        //设置redis key的序列化器
        template.setKeySerializer(stringRedisSerializer);
        //设置Hash类型的key设置序列化器
        template.setHashKeySerializer(stringRedisSerializer);

        /*设置redis value的序列化器
        redis的value最好不要设置String序列化，若设置序列化了，value只能存入String类型，不能存进LocalDateTime、LocalDate、LocalTime等时
        间类型（若想存这些类型也是可以的，需要将这些数据强转为string类型再存进value里即可），通常开发中我们是不需要查看value的，只需要查看key。*/
        // template.setValueSerializer(stringRedisSerializer);
        return template;
    }
}
